package com.trkj.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.trkj.dao.ArchiveDAO;
import com.trkj.dao.DeptDAO;
import com.trkj.dao.EmpDAO;
import com.trkj.dao.PositionDAO;
import com.trkj.dao.ProfessorDAO;
import com.trkj.dao.QuitDAO;
import com.trkj.dao.YearleaveDAO;
import com.trkj.enmu.EmpType;
import com.trkj.pojo.Archive;
import com.trkj.pojo.Dept;
import com.trkj.pojo.Emp;
import com.trkj.pojo.Menurole;
import com.trkj.pojo.Permission;
import com.trkj.pojo.Professor;
import com.trkj.pojo.Yearleave;
import com.trkj.vo.DanAnVo;
import com.trkj.vo.EditeEmpVo;
import com.trkj.vo.EmpAndDeptVo;
import com.trkj.vo.FunctionVo;

@Service
@Transactional
public class EmpService {
	/**
	 * 陈思洁
	 */
	@Autowired
	EmpDAO empDAO;
	/**
	 * 陈思洁
	 */
	@Autowired
	PositionDAO positionDAO;
	/**
	 * 陈思洁
	 */
	@Autowired
	DeptDAO deptDAO;
	/**
	 * 陈思洁
	 */
	@Autowired
	ArchiveDAO archiveDAO;
	/**
	 * 陈思洁
	 */
	@Autowired
	ProfessorDAO professorDAO;
	/**
	 * 陈思洁
	 */
	@Autowired
	YearleaveDAO yearleaveDAO;
	/**
	 * 陈思洁
	 */
	
	@Autowired
	QuitDAO quitDAO;
	
	/*public List<Object[]> queryAllEmpInfo() {
		List<Object[]> queryEmpAllInfo = empDao.FindempInfo();
		return queryEmpAllInfo;
	}*/
	/**
	 * 多表带条件的分页查询
	 * @author csj
	 * @param empName
	 * @param empState
	 * @param archivesEmptype
	 * @param page
	 * @param rows
	 * @return
	 */
	public Map<String,Object> pageSelect(String empName, String empState, String archivesEmptype,Integer page,
			Integer rows,String sort,String order) {
		Pageable Pageable = new PageRequest(page-1, rows,new Sort(Sort.Direction.fromStringOrNull(order),sort));
		Page<Emp> resultPage = empDAO.findAll(new Specification<Emp>() {
			@Override
			public Predicate toPredicate(Root<Emp> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				// TODO Auto-generated method stub
				Join<Emp, Archive> join = root.join("archive", JoinType.LEFT);
				Path<String> name = root.get("empName");
				Path<String> state = root.get("empState");
				Path<EmpType> path = join.get("archivesEmptype");
				Predicate p1 = null;
				Predicate p2 = null;
				Predicate p3 = null;
				if ((empName != null &&empName.length() > 0)
					&& (empState != null && empState.length() > 0)
					&& (archivesEmptype != null && archivesEmptype.length() > 0)) {
					p1 = cb.like(name, empName + "%");
					p2 = cb.equal(state, empState);
					EmpType empType = EmpType.valueOf(archivesEmptype);
					p3 = cb.equal(path, empType);
					return cb.and(p1,p2,p3);
					/*if (p1!=null&&p2!=null&&p3!=null) {
						
					}*/
				}else if ((empName != null &&empName.length() > 0)
						&& (empState != null && empState.length() > 0)) {
					p1 = cb.like(name, empName + "%");
					p2 = cb.equal(state, empState);
					return cb.and(p1,p2);
					
				}else if ((empName != null &&empName.length() > 0)
						&& (archivesEmptype != null && archivesEmptype.length() > 0)) {
					p1 = cb.like(name, empName + "%");
					EmpType empType = EmpType.valueOf(archivesEmptype);
					p3 = cb.equal(path, empType);
					return cb.and(p1,p3);
				}else if ((empState != null && empState.length() > 0)
						&& (archivesEmptype != null && archivesEmptype.length() > 0)) {
					p2 = cb.equal(state, empState);
					EmpType empType = EmpType.valueOf(archivesEmptype);
					p3 = cb.equal(path, empType);
					return cb.and(p2,p3);
				}else if ((empName != null &&empName.length() > 0)) {
					p1 = cb.like(name, empName + "%");
					return cb.and(p1);
					
				}else if ((empState != null && empState.length() > 0)) {
					p2 = cb.equal(state, empState);
					return cb.and(p2);
					
				}else if ((archivesEmptype != null && archivesEmptype.length() > 0)) {
					EmpType empType = EmpType.valueOf(archivesEmptype);
					p3 = cb.equal(path, empType);
					return cb.and(p3);
				}else {
					return null;
				}
			}
		},Pageable);
		//将封装到list集合的东西再次封装到map集合中
		List<DanAnVo> list = empVolist(resultPage.getContent());
		Map<String, Object> map=new HashMap<>();
		map.put("total", resultPage.getTotalElements());
		map.put("rows", list);
		return map;
		
	}
	/**@author csj
	 * 将vo层封装到list集合中
	 * @param list2
	 * @return
	 */
	private List<DanAnVo> empVolist(List<Emp> list2) {
		// TODO Auto-generated method stub
		List<DanAnVo> list = new ArrayList<DanAnVo>();
		for(Emp emp:list2){
			list.add(empVo(emp));
		}
		return list;
	}
	
	/**
	 * 将档案需要的数据封装到vo中
	 * @author csj
	 * @param emp
	 * @return
	 */
	private DanAnVo empVo(Emp emp) {
		DanAnVo vo = new DanAnVo();
		vo.setEmpid(emp.getEmpId()+"");
		vo.setEmpname(emp.getEmpName());
		vo.setDeptname(emp.getDept()!=null?emp.getDept().getDeptName():null);
		vo.setEmpsex(emp.getEmpSex());
		vo.setBirthday(emp.getEmpBirthday()==null?"":emp.getEmpBirthday()+"");
		vo.setEmpstate(emp.getEmpState()+"");
		//emp.getPosition().getPositionName()
		//System.out.println(emp.getPosition().getPositionName());
		//vo.setPositionname(emp.getPosition().getPositionName());
		vo.setPositionname(emp.getPosition()==null?"":emp.getPosition().getPositionName());
		if (emp.getArchive()!=null) {
			vo.setEmptype(emp.getArchive().getArchivesEmptype()+""==null?"":emp.getArchive().getArchivesEmptype()+"");
		}
		vo.setEntertime(emp.getEmpEntertime()+"");
		return vo;
	}
	/**
	 * 查询职称表中的记录
	 * @author csj
	 * @return
	 */
	public List<Map<String, Object>> findAll_professor_combobox() {
		List<Professor> findAll	= professorDAO.findAll();
		List<Map<String, Object>> listmap = new ArrayList<>();
		if (findAll!=null) {
			for (Professor professor : findAll) {
				Map<String, Object> map = new HashMap<>();
				map.put("professorId", professor.getProfessorId());
				map.put("professorName", professor.getProfessorName());
				listmap.add(map);
			}
		}
		return listmap;
	}
	/**
	 * 增加一个员工的基本信息和档案信息和年假信息
	 * @author csj
	 * @param emp
	 * @param deptId
	 * @param archive
	 * @return
	 */
	public Integer save_danAnInfo(Emp emp,Integer deptId,Archive archive,Integer professorId,Yearleave yearleave) {
		try {
			//判断传过来的emp对象是否为空 
			if (emp!=null) {
				//通过判断传过来的deptid是否为空，从而达到emp中是否存在dept这个对象
				if (deptId!=null) {
					//通过传过来的id找到dept表中的数据存放到对象中
					Dept dept = deptDAO.findOne(deptId);
					//将对象封装到emp的Dept中
					emp.setDept(dept);
				}
				//将数据保存到emp表中,并且以一个archiveEmp对象接收
				emp.setEmpPassword("123456");
				Emp archiveEmp = empDAO.save(emp);
				if (professorId!=null) {
					Professor professor = professorDAO.findOne(professorId);
					archive.setProfessor(professor);
				}
				//将archiveEmp对象封装到档案表中的emp中
				archive.setEmp(archiveEmp);
				//将数据保存到数据库archive表中
				archiveDAO.save(archive);
				yearleave.setYearleaveSurplus(10);
				yearleave.setYearleaveAlready(10);
				yearleave.setYearleaveAlready(0);
				yearleave.setEmp(archiveEmp);
				yearleaveDAO.save(yearleave);
				return 1;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		return 0;
	}
	/**
	 * 查询某一个人的个人信息
	 * @author csj
	 * @param empId
	 * @return 
	 * @return 
	 * @return 
	 */
	/*public Map<String, Object> editempInfos(Integer empId) {
		 Emp emp = empDAO.findOne(empId);
		 
		
	}*/

	 /* 登陆
	 * @param name
	 * @param pass
	 * @return 查找所有的权限ID
	 */
	public Emp login(String name,String pass) {
		Emp emp = empDAO.queryByNameAndPassword(name, pass);
        //判断当前用户是否有登陆权限
       /* if(emp != null){
            Set<FunctionVo> set = this.findPermissionByEmpId(emp.getEmpId());
            boolean flag = false;
            for(FunctionVo fun: set){
                if(fun.getFunId() == 2L){
                    flag = true;
                    break;
                }
            }
            if(!flag) return null;
        }*/
        return emp;
	}

    /**
     * 根据用户id返回所拥有的功能
     * @author csj
     * @param userId
     * @return
     */
	private Set<FunctionVo> findPermissionByEmpId(Integer empid) {
		 Emp emp = empDAO.findOne(empid);
	        List<Menurole> menuroles = emp.getMenuroles();
	        Set<FunctionVo> set = new TreeSet<FunctionVo>();
	        if(menuroles != null){
	            for(Menurole r: menuroles){
	                List<Permission> permissions = r.getPermissions();
	                for(Permission f: permissions){
	                    FunctionVo f2 = new FunctionVo();
	                    f2.setFunId((long) f.getPerId());
	                    f2.setFunName(f.getPerName());
	                    set.add(f2);
	                }
	            }
	        }
	        return set;
	}

	
	 /**
     * 根据用户id获取该用户的所有功能id
     * @param userId
     * @return
     */
//    public Set<Integer> getPermissionByEmpId(Integer empid){
//        Emp emp = empDAO.findOne(empid);
//        if(emp == null){
//            return null;//用户没有找到
//        }
//        //读取该用户的所有的功能id
//        return new HashSet<Integer>( empDAO.queryPerIdsByEmpId(emp.getEmpId()));
//    }
	
	
	 /**
     * 根据用户id获取该用户的所有功能id
     * @param userId
     * @return
     */
//    public Set<Integer> getPermissionByEmpId(Integer empid){
//        Emp emp = empDAO.findOne(empid);
//        if(emp == null){
//            return null;//用户没有找到
//        }
//        //读取该用户的所有的功能id
//        return new HashSet<Integer>( empDAO.queryPerIdsByEmpId(emp.getEmpId()));
//    }
	/**
	 * 查询个人的人员与档案信息
	 * @param emp2
	 * @return
	 */
	/*private List<EditeEmpVo> editemplist(Emp emp2) {
		// TODO Auto-generated method stub
		List<EditeEmpVo> list = new ArrayList<EditeEmpVo>();
		for (EditeEmpVo editeEmpVo : list) {
			list.add(editempVo(emp2));
		}
		return list;
	}*/
	
	
	/**
	 * 查询个人的人员与档案信息
	 * @author csj
	 * @param emp2
	 * @return
	 */
	public EditeEmpVo editempVo(Integer empId) {
		 Emp emp = empDAO.findOne(empId);
		EditeEmpVo vo = new EditeEmpVo();
		vo.setEmpId(emp.getEmpId()+"");
		vo.setEmpAddress(emp.getEmpAddress());
		vo.setEmpBirthday(emp.getEmpBirthday()==null?"":emp.getEmpBirthday()+"");
		vo.setEmpCornet(emp.getEmpCornet()==null?"":emp.getEmpCornet());
		vo.setEmpEmail(emp.getEmpEmail()==null?"":emp.getEmpEmail());
		vo.setEmpEntertime(emp.getEmpEntertime()+"");
		vo.setEmpLeavetime(emp.getEmpLeavetime()==null?"":emp.getEmpLeavetime()+"");
		vo.setEmpLoanbalance(emp.getEmpLoanbalance()+"");
		vo.setEmpName(emp.getEmpName());
		vo.setEmpPhone(emp.getEmpPhone());
		vo.setEmp_QQ(emp.getEmp_QQ()==null?"":emp.getEmp_QQ());
		vo.setEmpSex(emp.getEmpSex());
		vo.setEmpState(emp.getEmpState()+"");
		vo.setEmpWorktype(emp.getEmpWorktype()+"");
		vo.setArchivesEducation(emp.getArchive().getArchivesEducation());
		vo.setArchivesEmptype(emp.getArchive().getArchivesEmptype()+"");
		vo.setArchivesExplain(emp.getArchive().getArchivesExplain());
		vo.setArchivesIdcard(emp.getArchive().getArchivesIdcard());
		vo.setArchivesPositivetime(emp.getArchive().getArchivesPositivetime()+"");
		vo.setArchivesUrgentphone(emp.getArchive().getArchivesUrgentphone());
		vo.setDeptId(emp.getDept().getDeptId()+"");
		vo.setEmpLoginname(emp.getEmpLoginname());
		vo.setArchivesId(emp.getArchive().getArchivesId()+"");
		vo.setProfessorId(emp.getArchive().getProfessor()==null?"":emp.getArchive().getProfessor().getProfessorId()+"");
		vo.setEmpsj(emp.getEmp()==null?"":emp.getEmp().getEmpName());
		return vo;
	}
	
	/**
	 * 查询个人的详情
	 * @author csj
	 * @param emp2
	 * @return
	 */
	public EditeEmpVo checkemp(Integer empId) {
		 Emp emp = empDAO.findOne(empId);
		EditeEmpVo vo = new EditeEmpVo();
		vo.setEmpId(emp.getEmpId()+"");
		vo.setEmpAddress(emp.getEmpAddress());
		vo.setEmpBirthday(emp.getEmpBirthday()==null?"":emp.getEmpBirthday()+"");
		vo.setEmpCornet(emp.getEmpCornet()==null?"":emp.getEmpCornet());
		vo.setEmpEmail(emp.getEmpEmail()==null?"":emp.getEmpEmail());
		vo.setEmpEntertime(emp.getEmpEntertime()+"");
		vo.setEmpLeavetime(emp.getEmpLeavetime()==null?"":emp.getEmpLeavetime()+"");
		vo.setEmpLoanbalance(emp.getEmpLoanbalance()+"");
		vo.setEmpName(emp.getEmpName());
		vo.setEmpPhone(emp.getEmpPhone());
		vo.setEmp_QQ(emp.getEmp_QQ()==null?"":emp.getEmp_QQ());
		vo.setEmpSex(emp.getEmpSex().equals("1")?"男":"女");
		vo.setEmpState(emp.getEmpState()==1?"在职":"离职");
		vo.setEmpWorktype(emp.getEmpWorktype()+"");
		vo.setArchivesEducation(emp.getArchive().getArchivesEducation());
		vo.setArchivesEmptype(emp.getArchive().getArchivesEmptype()+"");
		vo.setArchivesExplain(emp.getArchive().getArchivesExplain());
		vo.setArchivesIdcard(emp.getArchive().getArchivesIdcard());
		vo.setArchivesPositivetime(emp.getArchive().getArchivesPositivetime()+"");
		vo.setArchivesUrgentphone(emp.getArchive().getArchivesUrgentphone());
		vo.setDeptId(emp.getDept().getDeptName());
		vo.setEmpLoginname(emp.getEmpLoginname());
		vo.setArchivesId(emp.getArchive().getArchivesId()+"");
		vo.setProfessorId(emp.getArchive().getProfessor()==null?"":emp.getArchive().getProfessor().getProfessorName());
		vo.setEmpsj(emp.getEmp()==null?"":emp.getEmp().getEmpName());
		vo.setPositionId(emp.getPosition()==null?"":emp.getPosition().getPositionName());
		String rolename="";
		List<Menurole> list=emp.getMenuroles();
		for (Menurole menurole : list) {
			rolename=rolename+","+menurole.getRoleName();
		}
		vo.setRolename(rolename==null?"":rolename);
		return vo;
	}
	
	/**
	 * 修改一个员工的个人信息
	 * @author csj
	 * @param emp
	 * @param archive
	 * @return
	 */
	public Integer revise_Info(Emp emp,Archive archive,Integer professorId) {
		try {
			System.out.println("员工编号："+emp.getEmpId());
			Emp one = empDAO.findOne(emp.getEmpId());
			emp.setPosition(one.getPosition());
			emp.setEmpPassword(one.getEmpPassword());
			emp.setDept(one.getDept());
			emp.setEmp(one.getEmp());
			Emp save = empDAO.save(emp);
			Archive two = archiveDAO.findOne(archive.getArchivesId());
			archive.setArchivesEmptype(two.getArchivesEmptype());
			Professor professor = professorDAO.findOne(professorId);
			archive.setProfessor(professor);
			archive.setEmp(save);
			Archive three = archiveDAO.save(archive);
			System.out.println("bch员工编号："+save.getEmpId());
			System.out.println("bch档案编号："+three.getArchivesId());
			return 1;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return 0;
	}
	

    /**
     * 修改用户密码
     * @param userId
     * @param name
     * @param pass
     */
    public boolean editEmpPassword(Integer empid, String oldPassword, String empPassword){
        Emp emp = empDAO.findOne(empid);
        if(!emp.getEmpPassword().equals(oldPassword)){
            return false;
        }
        if(empPassword != null){
            emp.setEmpPassword(empPassword);
            return true;
        }
        return false;
    }
    
    
    
    
    /**
     * 查询个人员工信息
     * @param empid
     * @author skm
     */
    public EmpAndDeptVo selectEmpAndDept(Integer empid) {
    	 Emp emp= empDAO.findOne(empid);
    	 EmpAndDeptVo vo = new EmpAndDeptVo();
    	 vo.setEmpId(emp.getEmpId()+"");
    	 vo.setEmpLoginname(emp.getEmpLoginname());
    	 vo.setEmpName(emp.getEmpName());
    	 vo.setEmpPhone(emp.getEmpPhone());
    	 vo.setEmp_QQ(emp.getEmp_QQ()==null?"":emp.getEmp_QQ());
    	 vo.setEmpEmail(emp.getEmpEmail());
    	 vo.setEmpCornet(emp.getEmpCornet()==null?"":emp.getEmpCornet());
    	 vo.setEmpSex(emp.getEmpSex().equals("1")?"男":"女");
    	 vo.setEmpBirthday(emp.getEmpBirthday()==null?"":emp.getEmpBirthday()+"");
    	 vo.setEmpAddress(emp.getEmpAddress());
    	 vo.setDeptName(emp.getDept().getDeptName());
    	 vo.setPositionName(emp.getPosition().getPositionName());
    	 List<Menurole> list=emp.getMenuroles();
    	 String rolenames=null;
    	 for (Menurole menurole : list) {
			rolenames=menurole.getRoleName();
		}
    	 vo.setRoleName(rolenames);
    	 return vo;
    }

    /**
     * 修改个人信息
     * @param empid
     * @return
     * @author skm
     */
    public Integer updateEmpInformation(Emp emp,Integer empid) {
   	 try {
		Emp emp1= empDAO.findOne(empid);
		 emp1.setEmpName(emp.getEmpName());
		 emp1.setEmpSex(emp.getEmpSex());
		 emp1.setEmpPhone(emp.getEmpPhone());
		 emp1.setEmp_QQ(emp.getEmp_QQ());
		 emp1.setEmpBirthday(emp.getEmpBirthday());
		 emp1.setEmpEmail(emp.getEmpEmail());
		 emp1.setEmpAddress(emp.getEmpAddress());
		 return 1;
	} catch (Exception e) {
		e.printStackTrace();
	}
   	 return 0;
   
   }
    
    /**
     * 上传头像
     * @return
     * @author skm
     */
    public Integer updateEmpAvatar(Emp emp,Integer empid,String sqlAvatar) {
    	try {
			Emp avatar = empDAO.findOne(empid);
			avatar.setEmpImg(emp.getEmpImg());
			return 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return 0;
    }
    
   
}
